package is1;

import java.util.ArrayList;
import java.util.HashMap;

public class Sistema
{
	private static Sistema		unicoSistema	= null;
	private Venta				ventaActual;
	private ArrayList<Venta>	ventas;

	private Sistema()
	{

	}

	public static Sistema getInstance()
	{
		if (unicoSistema == null)
		{
			unicoSistema = new Sistema();
		}

		return unicoSistema;
	}

	public void setFicheroSalida (String fichero)
	{
		Configurador.setRutaFichero(fichero);
	}
	
	public void inicializar() throws ExcepcionTPV
	{
		ventas = new ArrayList<Venta>();

		Configurador.setInstance(ConfiguradorTXT.getInstance());
		try
		{
			Configurador.getInstance().configurar();
		}
		catch (ExcepcionTPV ex)
		{
			throw new ExcepcionTPV("Error con el configurador: " + ex.toString());
		}
	}

	public void crearNuevaVenta(Fecha f, HashMap<String, String> Atributos) throws ExcepcionTPV
	{
		if (Atributos == null || f == null)
		{
			throw new ExcepcionTPV("Error con los parámetros");
		}
		ArrayList<Atributo> atributos = LectorAtributos.leer(Atributos);
		ventaActual = new Venta(atributos, f);
	}

	public void anaydirLinVenta(String codigo, int cantidad) throws ExcepcionTPV
	{
		Producto producto = null;
		producto = Catalogos.getInstance().getProducto(codigo);

		if (ventaActual == null)
		{
			throw new ExcepcionTPV("No hay venta actual");
		}
		if (producto != null)
		{
			ventaActual.addLinea(producto, cantidad);
		}
		else
		{
			throw new ExcepcionTPV("El producto con código " + codigo + " no existe");
		}
	}

	public void cerrarVenta() throws ExcepcionTPV
	{
		if (ventaActual != null)
		{
			ventas.add(ventaActual);
			try
			{
				AplicarDescuento.getInstance().aplicar(ventaActual);
			}
			catch (ExcepcionTPV e)
			{
				throw new ExcepcionTPV("Error con el cálculo de descuentos: " + e.toString());
			}

			try
			{
				CalculadoraImpuestos.getInstance().calcularImpuestos(ventaActual);
			}
			catch (ExcepcionTPV e)
			{
				throw new ExcepcionTPV("Error con el cálculo de impuestos: " + e.toString());
			}
		}
		Salida.getInstance().escribirSalida(ventaActual);

		ventaActual = null;
	}
}
